home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Database Designers / Rational Rose 2000 / Rational Setup.EXE / common / lib / MSWin32-x86 / CORE / hv.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  3.8 KB  |  121 lines

  1. /*    hv.h
  2.  *
  3.  *    Copyright (c) 1991-1997, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. typedef struct he HE;
  11. typedef struct hek HEK;
  12.  
  13. struct he {
  14.     HE        *hent_next;
  15.     HEK        *hent_hek;
  16.     SV        *hent_val;
  17. };
  18.  
  19. struct hek {
  20.     U32        hek_hash;
  21.     I32        hek_len;
  22.     char    hek_key[1];
  23. };
  24.  
  25. /* This structure must match the beginning of struct xpvmg in sv.h. */
  26. struct xpvhv {
  27.     char *    xhv_array;    /* pointer to malloced string */
  28.     STRLEN    xhv_fill;    /* how full xhv_array currently is */
  29.     STRLEN    xhv_max;    /* subscript of last element of xhv_array */
  30.     IV        xhv_keys;    /* how many elements in the array */
  31.     double    xnv_nv;        /* numeric value, if any */
  32.     MAGIC*    xmg_magic;    /* magic for scalar array */
  33.     HV*        xmg_stash;    /* class package */
  34.  
  35.     I32        xhv_riter;    /* current root of iterator */
  36.     HE        *xhv_eiter;    /* current entry of iterator */
  37.     PMOP    *xhv_pmroot;    /* list of pm's for this package */
  38.     char    *xhv_name;    /* name, if a symbol table */
  39. };
  40.  
  41. #define PERL_HASH(hash,str,len) \
  42.      STMT_START    { \
  43.     register char *s_PeRlHaSh = str; \
  44.     register I32 i_PeRlHaSh = len; \
  45.     register U32 hash_PeRlHaSh = 0; \
  46.     while (i_PeRlHaSh--) \
  47.         hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
  48.     (hash) = hash_PeRlHaSh; \
  49.     } STMT_END
  50.  
  51.  
  52. /* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
  53. #define HEf_SVKEY    -2    /* hent_key is a SV* */
  54.  
  55.  
  56. #define Nullhv Null(HV*)
  57. #define HvARRAY(hv)    ((HE**)((XPVHV*)  SvANY(hv))->xhv_array)
  58. #define HvFILL(hv)    ((XPVHV*)  SvANY(hv))->xhv_fill
  59. #define HvMAX(hv)    ((XPVHV*)  SvANY(hv))->xhv_max
  60. #define HvKEYS(hv)    ((XPVHV*)  SvANY(hv))->xhv_keys
  61. #define HvRITER(hv)    ((XPVHV*)  SvANY(hv))->xhv_riter
  62. #define HvEITER(hv)    ((XPVHV*)  SvANY(hv))->xhv_eiter
  63. #define HvPMROOT(hv)    ((XPVHV*)  SvANY(hv))->xhv_pmroot
  64. #define HvNAME(hv)    ((XPVHV*)  SvANY(hv))->xhv_name
  65.  
  66. #define HvSHAREKEYS(hv)        (SvFLAGS(hv) & SVphv_SHAREKEYS)
  67. #define HvSHAREKEYS_on(hv)    (SvFLAGS(hv) |= SVphv_SHAREKEYS)
  68. #define HvSHAREKEYS_off(hv)    (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
  69.  
  70. #define HvLAZYDEL(hv)        (SvFLAGS(hv) & SVphv_LAZYDEL)
  71. #define HvLAZYDEL_on(hv)    (SvFLAGS(hv) |= SVphv_LAZYDEL)
  72. #define HvLAZYDEL_off(hv)    (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
  73.  
  74. #ifdef OVERLOAD
  75.  
  76. /* Maybe amagical: */
  77. /* #define HV_AMAGICmb(hv)      (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
  78.  
  79. #define HV_AMAGIC(hv)        (SvFLAGS(hv) &   SVpgv_AM)
  80. #define HV_AMAGIC_on(hv)     (SvFLAGS(hv) |=  SVpgv_AM)
  81. #define HV_AMAGIC_off(hv)    (SvFLAGS(hv) &= ~SVpgv_AM)
  82.  
  83. /*
  84. #define HV_AMAGICbad(hv)     (SvFLAGS(hv) & SVpgv_badAM)
  85. #define HV_badAMAGIC_on(hv)  (SvFLAGS(hv) |= SVpgv_badAM)
  86. #define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
  87. */
  88.  
  89. #endif /* OVERLOAD */
  90.  
  91. #define Nullhe Null(HE*)
  92. #define HeNEXT(he)        (he)->hent_next
  93. #define HeKEY_hek(he)        (he)->hent_hek
  94. #define HeKEY(he)        HEK_KEY(HeKEY_hek(he))
  95. #define HeKEY_sv(he)        (*(SV**)HeKEY(he))
  96. #define HeKLEN(he)        HEK_LEN(HeKEY_hek(he))
  97. #define HeVAL(he)        (he)->hent_val
  98. #define HeHASH(he)        HEK_HASH(HeKEY_hek(he))
  99. #define HePV(he,lp)        ((HeKLEN(he) == HEf_SVKEY) ?        \
  100.                  SvPV(HeKEY_sv(he),lp) :        \
  101.                  (((lp = HeKLEN(he)) >= 0) ?        \
  102.                   HeKEY(he) : Nullch))
  103.  
  104. #define HeSVKEY(he)        ((HeKEY(he) &&                 \
  105.                   HeKLEN(he) == HEf_SVKEY) ?        \
  106.                  HeKEY_sv(he) : Nullsv)
  107.  
  108. #define HeSVKEY_force(he)    (HeKEY(he) ?                \
  109.                  ((HeKLEN(he) == HEf_SVKEY) ?        \
  110.                   HeKEY_sv(he) :            \
  111.                   sv_2mortal(newSVpv(HeKEY(he),        \
  112.                              HeKLEN(he)))) :    \
  113.                  &PL_sv_undef)
  114. #define HeSVKEY_set(he,sv)    ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
  115.  
  116. #define Nullhek Null(HEK*)
  117. #define HEK_BASESIZE        STRUCT_OFFSET(HEK, hek_key[0])
  118. #define HEK_HASH(hek)        (hek)->hek_hash
  119. #define HEK_LEN(hek)        (hek)->hek_len
  120. #define HEK_KEY(hek)        (hek)->hek_key
  121.